package com.xuecheng.media.controller;


import com.xuecheng.base.model.PageParams;
import com.xuecheng.base.model.PageResult;
import com.xuecheng.base.result.RestResponse;
import com.xuecheng.media.model.dto.QueryMediaParamsDTO;
import com.xuecheng.media.model.dto.UploadFileResultDTO;
import com.xuecheng.media.model.po.MediaFiles;
import com.xuecheng.media.service.IMediaFilesService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import org.springframework.web.multipart.MultipartFile;

/**
 * <p>
 * 媒资信息 前端控制器
 * </p>
 *
 * @author 勾新杰
 * @since 2025-01-16
 */
@RestController
@RequiredArgsConstructor
@Api(tags = "媒资文件管理", value = "媒资文件管理")
public class MediaFilesController {

    private final IMediaFilesService mediaFilesService;

    /**
     * 媒资列表查询接口
     *
     * @param pageParams          分页参数
     * @param queryMediaParamsDTO 查询条件
     * @return 查询结果
     */
    @PostMapping("/media-files")
    @ApiOperation("媒资列表查询接口")
    public PageResult<MediaFiles> list(
            PageParams pageParams,
            @RequestBody(required = false) QueryMediaParamsDTO queryMediaParamsDTO) {
        return mediaFilesService.queryMediaFiles(pageParams, queryMediaParamsDTO);
    }

    /**
     * 删除文件
     *
     * @return 文件信息
     */
    @DeleteMapping("/media-files/{id}") // 这里要对路径重命名一下，不然会和接口文档的路径冲突，血淋淋的痛
    @ApiOperation(value = "删除文件")
    public RestResponse<Boolean> delete(@PathVariable String id) {
        return mediaFilesService.deleteById(id);
    }

    /**
     * 根据id查询文件信息
     *
     * @return 文件信息
     */
    @GetMapping("/media-files/{id}")
    @ApiOperation(value = "根据id查询文件信息")
    public MediaFiles getById(@PathVariable String id) {
        return mediaFilesService.getById(id);
    }

    /**
     * 上传文件
     *
     * @return 文件信息
     */
    @PostMapping("/upload/course-file")
    @ApiOperation("上传小文件（图片、文本）")
    public UploadFileResultDTO upload(@RequestPart("filedata") MultipartFile file, @RequestParam(required = false) Long courseId) {
        return mediaFilesService.upload(file, courseId);
    }

    /**
     * 检查文件是否存在
     *
     * @param fileMd5 文件md5
     * @return 文件信息
     */
    @PostMapping("/upload/check-file")
    @ApiOperation(value = "文件上传前检查文件")
    public RestResponse<Boolean> checkFile(@RequestParam("fileMd5") String fileMd5) {
        return mediaFilesService.checkFile(fileMd5);
    }

    /**
     * 检查分块文件是否存在
     *
     * @param fileMd5 文件md5
     * @param chunk   分块序号
     * @return 文件信息
     */
    @PostMapping("/upload/check-chunk")
    @ApiOperation(value = "分块文件上传前的检测")
    public RestResponse<Boolean> checkChunk(
            @RequestParam("fileMd5") String fileMd5,
            @RequestParam("chunk") int chunk) {
        return mediaFilesService.checkChunk(fileMd5, chunk);
    }

    /**
     * 上传分块文件
     *
     * @param file    文件
     * @param fileMd5 文件md5
     * @param chunk   分块序号
     * @return 文件信息
     * @throws Exception 异常
     */
    @PostMapping("/upload/upload-chunk")
    @ApiOperation(value = "上传分块文件")
    public RestResponse<String> uploadChunk(
            @RequestParam("file") MultipartFile file,
            @RequestParam("fileMd5") String fileMd5,
            @RequestParam("chunk") int chunk) throws Exception {
        return mediaFilesService.uploadChunk(file, fileMd5, chunk);
    }

    /**
     * 合并文件
     *
     * @param fileMd5    文件md5
     * @param fileName   文件名
     * @param chunkTotal 分块总数
     * @return 文件信息
     */
    @PostMapping("/upload/merge-chunks")
    @ApiOperation(value = "合并文件")
    public RestResponse<String> mergeChunks(
            @RequestParam("fileMd5") String fileMd5,
            @RequestParam("fileName") String fileName,
            @RequestParam("chunkTotal") int chunkTotal) {
        return mediaFilesService.mergeChunks(fileMd5, fileName, chunkTotal);
    }

    /**
     * 预览文件
     *
     * @param id 文件id
     * @return 文件信息
     */
    @GetMapping("/preview/{id}")
    @ApiOperation(value = "预览文件")
    public RestResponse<String> preview(@PathVariable String id) {
        String url = mediaFilesService.preview(id);
        return RestResponse.success(url);
    }

    /**
     * 删除课程html文件
     *
     * @param courseId 课程id
     * @return 删除结果
     */
    @DeleteMapping("/course-files/{courseId}")
    RestResponse<Boolean> deleteCourseHtml(@PathVariable("courseId") Long courseId){
        return mediaFilesService.deleteCourseHtml(courseId);
    }
}
